package org.example.design.factory.abstractfactory;

import org.example.design.factory.Pc;
import org.example.design.factory.Phone;
import org.example.bean.pojo.IPhone;
import org.example.bean.pojo.Mac;
import org.example.bean.pojo.MiPC;
import org.example.bean.pojo.MiPhone;

/**
 * @author huangshen
 * @version 0
 * @description PhoneAbstractFactory
 * @since 2022/1/29 20:37
 */
public class PhoneAbstractFactory {

    /**
     *  抽象工厂：
     *      优点：
     *          抽象工厂模式除了具有工厂方法模式的优点外，最主要的优点就是可以在类的内部对产品族进行约束。
     *          所谓的产品族，一般或多或少的都存在一定的关联，抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述，
     *              而不必专门引入一个新的类来进行管理。
     *      缺点：
     *          产品族的扩展将是一件十分费力的事情，假如产品族中需要增加一个新的产品，则几乎所有的工厂类都需要进行修改。
     *          所以使用抽象工厂模式时，对产品等级结构的划分是非常重要的。
     *      适用场景：
     *          当需要创建的对象是一系列相互关联或相互依赖的产品族时，便可以使用抽象工厂模式。
     *          即一个继承体系中，如果存在着多个等级结构（即存在着多个抽象类），并且分属各个等级结构中的实现类之间存在着一定的关联或者约束，
     *          就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束，则使用多个独立的工厂来对产品进行创建，则更合适一点。
     */

    public static class AppleFactory implements AbstractFactory {

        @Override
        public Phone makePhone() {
            return new IPhone();
        }

        @Override
        public Pc makePc() {
            return new Mac();
        }

    }

    public static class XiaoMiFactory implements AbstractFactory{

        @Override
        public Phone makePhone() {
            return new MiPhone();
        }

        @Override
        public Pc makePc() {
            return new MiPC();
        }

    }

}
